#include "Widget.h"
#include "Boss.h"
#include <QPushButton>
#include "Role.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
//    //观察者 Boss  处理函数 死亡打印
//    //被观察者 按钮  信号  点击
//    //按钮点击 Boss 死亡
//    QPushButton* btn = new QPushButton("点我杀白蛇", this);     //被观察者
//    //Boss* boss = new Boss(this);        //观察者
//    Boss* boss1 = new Boss("白蛇", 2000);        //观察者
//    //Boss* boss2 = new Boss("青蛇", 1500);
//    connect(btn, &QPushButton::clicked, boss1, &Boss::BossDeadSlots);     //绑定信号
//    btn->move(100, 0);


    //Boss 死亡信号  广播后，触发 Boss 死亡槽函数
    // 点击按钮，触发  Boss死亡信号  Boss 死亡信号 触发Boss 死亡
    this->_boss = new Boss("美猴王", 20000, this);
    QPushButton* btn2 = new QPushButton("点我", this);


    //点击播放死亡信号  调用槽函数
    connect(btn2, &QPushButton::clicked, this, &Widget::BossDeadBoardcast);

    //死亡信号触发， 死亡函数调用
    //connect(this->_boss, &Boss::DeadSignal, this->_boss, &Boss::BossDeadSlots);


    // 重载后的无参调用  利用函数指针实现重载的不同调用
    void (Boss::*deadSignal_0)() = &Boss::DeadSignal;
    void (Boss::*bossDeadSlots_0)() = &Boss::BossDeadSlots;
    connect(this->_boss, deadSignal_0, this->_boss, bossDeadSlots_0);




    //Boss 死亡信号触发后，角色获得经验处理
    this->_role = new Role;
    //connect(this->_boss, &Boss::DeadSignal, this->_role, &Role::GetExp);
    //信号不带参，槽函数带参，参数不知从何而来   因此需要信号也重载一下



    //链接带参数的信号和槽
    void (Boss::*deadSignal)(int) = &Boss::DeadSignal;
    void (Role::*getExp)(int) = &Role::GetExp;
    connect(this->_boss, deadSignal, this->_role, getExp);


    //信号绑定信号
    QPushButton* btn3 = new QPushButton("信号连接信号测试", this);
    btn3->move(300, 0);
    void (Role::*getexp)() = &Role::GetExp;
    connect(btn3, &QPushButton::clicked, this->_boss, deadSignal_0);
    connect(this->_boss, deadSignal_0, this->_role, getexp);

    //断开该 信号和槽的连接

    //disconnect(btn3, &QPushButton::clicked, this->_boss, deadSignal_0);





}

Widget::~Widget()
{
}

void Widget::BossDeadBoardcast(){

    //触发死亡信号逻辑
    qDebug()<<"死亡信号广播";
    //emit  可加可不加   触发 无参信号
    emit _boss->DeadSignal();   // 触发无参  死亡信号
    emit _boss->DeadSignal(this->_boss->exp);   //触发有参  死亡信号

}
